package com.mdz.sbgl;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 孟德志
 * @create 2019-08-03-17:58
 */
public class Testgen {

    public static void main(String[] args) {
       //代码生成

        AutoGenerator mpg=new AutoGenerator();
        //mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        String projectPath=System.getProperty("user.dir");

        //全局配置
        GlobalConfig config=new GlobalConfig();
        //是否开启活动记录功能
        config.setActiveRecord(true)
                //设置作者
                .setAuthor("孟德志")
                //是否设置xml文件中的通用查询结果列
                .setBaseColumnList(true)
                //是否设置xml文件中的通用查询映射结果
                .setBaseResultMap(true)
                //设置文件的输出目录位置
                .setOutputDir(projectPath+"/src/main/java")
                //是否打开输出的目录
                .setOpen(false)
                //是否覆盖已有的文件
                .setFileOverride(true)
                //指定生成的主键策略
                .setIdType(IdType.AUTO)
                //指定生成的Controller文件名
                .setControllerName("%sController")
                //指定生成的Service文件名
                .setServiceName("%sService")
                //指定生成的ServiceImpl文件名
                .setServiceImplName("%sServiceImpl")
                //指定生成的Entity文件名
                .setEntityName("%s")
                //指定生成的Mapper文件名
                .setMapperName("%sMapper");
        mpg.setGlobalConfig(config);
        //配置数据源
        DataSourceConfig dsc=new DataSourceConfig();
        //指定驱动名称
        //dsc.setDriverName("net.sourceforge.jtds.jdbc.Driver");
        dsc.setDriverName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        //指定驱动连接的URL
        //dsc.setUrl("jdbc:jtds:sqlserver://localhost:1433/ksoa_yk");
//        dsc.setUrl("jdbc:sqlserver://localhost:1433;DatabaseName=YJSM");
        dsc.setUrl("jdbc:sqlserver://192.168.0.13:1388;SelectMethod=cursor;DatabaseName=sbgl");
        //指定数据库的用户名
        dsc.setUsername("sa");
        //指定数据库的密码
//        dsc.setPassword("45168537l");
        dsc.setPassword("gaksoa");
        //类型转换
        dsc.setTypeConvert(new MySqlTypeConvert(){
            @Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                if(fieldType.toLowerCase().contains("tinyint")){
                    return DbColumnType.INTEGER;
                }
                if (fieldType.toLowerCase().contains("datetime")){
                    return DbColumnType.DATE;
                }
                return super.processTypeConvert(globalConfig, fieldType);
            }
        });
        mpg.setDataSource(dsc);
        //包的定义
        PackageConfig pc=new PackageConfig();
        //指定父包名
        pc.setParent("com.mdz")
                //指定模块名
                .setModuleName("sbgl")
                //设置Controller的包名
                .setController("Controller")
                //设置Entity的包名
                .setEntity("Entity")
                //设置Service的包名
                .setService("Service")
                //设置ServiceImpl的包名
                .setServiceImpl("Service.Impl")
                //设置Mapper的包名
                .setMapper("Mapper")
                //设置Mapper xml文件的包名
                .setXml("Mapper");
        mpg.setPackageInfo(pc);
        //策略定义
        StrategyConfig strategy=new StrategyConfig();
        //实体类型是否为lombok模型
        strategy.setEntityLombokModel(true)
                //是否移除字段的is
                .setEntityBooleanColumnRemoveIsPrefix(false)
                //是否生成RestController
                .setRestControllerStyle(false)
                //设置只生成指定的表名的文件
                .setInclude("fwdzb")
                //在Controller中requestMapping注解是否用驼峰命名规则
                .setControllerMappingHyphenStyle(false)
                //数据库大写下划线转换
                .setCapitalMode(true)
                //实体类中的字段名设置成驼峰命名规则
                .setColumnNaming(NamingStrategy.underline_to_camel)
                .setEntityBuilderModel(true)
                //更新时
                //.setVersionFieldName("gm")
                //开启字段名静态常量
                //.setEntityColumnConstant(true)
                //是否开启实体类的序列化
                .setEntitySerialVersionUID(true)
                //设置数据库表名是否是驼峰命名规则
                .setNaming(NamingStrategy.underline_to_camel)
                //是否开启表字段名的注解
                .setEntityTableFieldAnnotationEnable(true)
                //逻辑删除，不是真的删除
                .setLogicDeleteFieldName("status");
        mpg.setStrategy(strategy);
        //自定义配置
        //String templatePath = "/templates/mapper.xml.ftl";
        String templatePath="/templates/mapper.xml.vm";
        InjectionConfig injectionConfig=new InjectionConfig() {
            @Override
            public void initMap() {

            }
        };

        List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
        // 调整 xml 生成目录演示
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return projectPath + "/src/main/resources/Mapper/" + tableInfo.getEntityName() + "Mapper"
                        + StringPool.DOT_XML;
            }
        });
        injectionConfig.setFileOutConfigList(focList);
        mpg.setCfg(injectionConfig);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 执行生成
        mpg.execute();
        System.out.println(projectPath);
    }
}
